package com.cqhilink.iot.jobstandardmanagement.facade.service.employee;

import com.alibaba.fastjson.JSONObject;
import com.cqhilink.iot.jobstandardmanagement.facade.model.*;

import java.util.List;
import java.util.Map;

/**
 * Created by zmling on 2016/11/22.
 * 人员信息
 */
public interface JsmEmployeeService {

    /**
     * 新增
     *
     * @param employee            添加用户
     * @param employeeCertificate 添加人员证书
     * @param uploadFiles         上传头像
     * @param deletedFiles        删除头像
     * @param e                   登录用户所有信息
     * @throws Exception
     */
    void employeeAdd(Employee employee, List<EmployeeCertificate> employeeCertificate, String uploadFiles, String deletedFiles, Employee e) throws Exception;

    /**
     * 分页查询
     *
     * @param employee
     * @return
     * @throws Exception
     */
    JSONObject findEmployeeList(EmployeeVo employee) throws Exception;

    /**
     * 通过主键I的查询
     *
     * @param employeeId
     * @return
     * @throws Exception
     */
    EmployeeVo findEmployeeById(String employeeId) throws Exception;

    /**
     * 修改人员信息
     *
     * @param employee
     * @param employeeCertificate
     * @param uploadFiles
     * @param deletedFiles
     * @throws Exception
     */
    void employeeUpdate(Employee employee, List<EmployeeCertificate> employeeCertificate, String uploadFiles, String deletedFiles, Employee e) throws Exception;

    /**
     * 删除人员信息
     *
     * @param employee
     * @return
     * @throws Exception
     */
    int deletEemployee(Map employee) throws Exception;


    /**
     * 查询所有人员信息
     *
     * @param employee
     * @return
     * @throws Exception
     */
    List<EmployeeVo> queryList(Employee employee) throws Exception;

    /**
     * 外部接口，查询所有人员信息
     *
     * @param employee
     * @return
     * @throws Exception
     */
    List<EmployeeVo> findEmployees(Employee employee) throws Exception;


    /**
     * 根据角色和部门查询或者其他查询人员信息
     *
     * @return
     */
    List<EmployeeVo> queryEmployeeByRoleDept(Map selectMap);

    /**
     * @param list
     * @Author 卢曼成
     * @Description 批量插入
     * @Date 2017/2/8 18:04
     */
    int insertList(List<Employee> list);

    /**
     * @param list
     * @Author 卢曼成
     * @Description 批量修改
     * @Date 2017/2/8 17:18
     */
    int updateList(List<Employee> list);

    /**
     * @param list
     * @Author 卢曼成
     * @Description 批量逻辑删除
     * @Date 2017/2/8 17:18
     */
    int deleteList(List<Employee> list);

    /**
     * 加载人员混合树
     *
     * @param orgId
     * @param sync
     * @param openOrg
     * @param openDept
     * @param keyword
     * @return
     * @throws Exception
     */
    List<Ztree> loadEmployeeZtree(String orgId, boolean sync, boolean openOrg, boolean openDept, String keyword) throws Exception;

    /**
     * 获取指定组织下的所有后代组织、后代部门、后代人员的混合树
     * @param orgId
     * @return
     */
    List<Ztree> getEmployeeMixedZtreeByOrgId(String orgId) throws Exception;

    /**
     * 人员混合树的设置组织的ztree的isParent
     *
     * @param ztree
     * @param orgId
     * @throws Exception
     */
    void setOrgZtreeIsParent(Ztree ztree, String orgId) throws Exception;

    /**
     * 人员混合树的设置部门的ztree的isParent
     *
     * @param ztree
     * @param orgId
     * @throws Exception
     */
    void setDepZtreeIsParent(Ztree ztree, String orgId) throws Exception;

    /**
     * @param orgId              组织机构Id
     * @param isLoadOrg          是否加载组织
     * @param isLoadDept         是否加载部门
     * @param isLoadOrgEmployee  加载机构下面的人
     * @param isLoadDeptEmployee 加载部门下的人
     * @param maxLevel           显示组织的最大层级
     * @param lessLevel          显示组织的最小层级
     * @param keyword            搜索值
     */
    List<Ztree> loadEmployeeZtree(String orgId, boolean isLoadOrg, boolean isLoadDept,
                                  boolean isLoadOrgEmployee, boolean isLoadDeptEmployee, String maxLevel, String lessLevel, String keyword) throws Exception;


    /**
     * @Author 卢曼成
     * @Description 根据org查询该节点人员
     * @Date 2017/3/11 17:01
     */
    public List<Ztree> loadEmployeeZtree(String orgId) throws Exception;

    /**
     * @param employeeId
     * @return Employee
     * @Author 卢曼成
     * @Description 根据ID查询
     * @CreateDateTime 2017/3/15 14:53
     **/
    public Employee queryByKeyId(String employeeId);

    /**
     * @param list
     * @return List<String>
     * @Author 卢曼成
     * @Description 根据ID查询数据是否存在
     */
    List<String> selectByListId(List<Employee> list);

    /**
     * @param list
     * @return List<String>
     * @Author 卢曼成
     * @Description 根据postId获取关联的用户数量
     */
    int selectByPostCount(List<String> list);

    /**
     * @param employee 根据条件查询 人员信息 { 主要用于组织查询人 和 部门查询人信息 }
     */
    List<Employee> selectListEmploye(Employee employee);

    /**
     * @param employeeId
     * @param email
     * @return boolean
     * @Author 卢曼成
     * @Description 验证邮箱是否重复
     */
    boolean isExisEmail(String employeeId, String email);

    /**
     * @param employeeId
     * @param loginId
     * @return boolean
     * @Author 卢曼成
     * @Description 验证用户名是否重复
     */
    boolean isExisLogId(String employeeId, String loginId);

    /**
     * @param employeeId
     * @param workNumber
     * @return boolean
     * @Author 卢曼成
     * @Description 验证用户工号是否重复
     */
    boolean isWorkNumber(String employeeId, String workNumber);

    /**
     * 根据组织机构根据当前组织机构 获得当前组织机构及一下的人员和组织机构
     *
     * @param orgId
     * @param roleId
     */
    List<PermissionErModel> loadEmployeeByOrgsOrDept(String orgId, String roleId) throws Exception;

    /**
     * @param employeeVo 当前登录人 ，
     * @param rolesName  角色名称
     */
    List<Employee> getEmployeeListByRole(EmployeeVo employeeVo, String rolesName) throws Exception;

    /**
     * @param employeeVo 当前登录人 ，
     * @param rolesName  角色名称
     */
    public List<Ztree> queryEmployeeZtree(EmployeeVo employeeVo, String rolesName) throws Exception;

    /**
     * @param employeeVo 当前登录人 ，
     * @param rolesName  角色名称
     */
    List<EmployeeVo> queryEmployeeList(EmployeeVo employeeVo, String rolesName) throws Exception;

    /**
     * 批量修改用户组织部门
     *
     * @param employeeVo
     * @return
     */
    int editOrg(EmployeeVo employeeVo);

    /**
     * 查询组织部门人员树形
     *
     * @param iconSkin
     * @param orgId
     * @param pOrgId
     * @param keyword
     * @return
     * @throws Exception
     */
    List<Ztree> initUserZtree(String iconSkin, String orgId, String pOrgId, String keyword) throws Exception;

    /**
     * 根据ID集合查询数据
     *
     * @param list
     * @return
     */
    List<Employee> selectByKeyList(List<String> list);

    /**
     * Excel导入用户信息
     *
     * @param evList 导入的Excel数据集合
     * @param orgId  导入人所属组织
     * @param userId 导入人ID
     * @return
     */
    Map<String, Object> importExcelUser(List<Employee> evList, String orgId, String userId) throws Exception;

    /**
     * 查询导入组织树形
     *
     * @param orgId   登录人员所属组织
     * @param pOrgId  树形上级组织
     * @param keyword 条件搜索
     * @return
     * @throws Exception
     */
    public List<Ztree> initExcelTree(String orgId, String pOrgId, String keyword) throws Exception;

    /**
     * 验证工卡ID是否重复
     *
     * @param employeeId
     * @param cardId
     * @return
     */
    boolean isCard(String employeeId, String cardId);

    /**
     * 上传人员头像图片信息
     *
     * @param uploadFiles 图片信息
     * @param orgId       组织ID
     * @return
     */
    Map<String, Object> uploadImg(String uploadFiles, String orgId);

    /**
     * @param orgId 作业区机构id，查询作业区下 所有的部门负责人
     * @return
     * @throws Exception
     */
    List<Ztree> queryDeptManagerList(String orgId) throws Exception ;

    /**
     * @return 根据当前人查询该人所在作业区 的部门负责人
     * @throws Exception
     */
    public List<Ztree> queryDeptManagerListByEmployeeVo(Employee employee) throws Exception ;

    /**
     * @param deptId 传部门id, 查询部门下所有的人员信息 （多个部门，逗号隔开 ）
     * @return
     * @throws Exception
     */
    public List<Ztree> queryDeptList(String deptId) throws Exception ;


    /**
     * 作业区人员分布统计报表页面查询
     *
     * @param orgId
     * @return
     */
    Map<String, Object> findReportFormList(String orgId);


    /**
     * 根据当前人所属组织机构和菜单id，查询作业区下所有拥有该菜单的用户
     * @param orgId
     * @param menuId
     * @Author chenpeng
     * @return
     */
    public List<Employee> queryOwnMenuConditionByOrgId(String orgId, String menuId);


    /**
     * @param employeeVo 当前登录人
     * @return 获取到当前登录人所在当前登录人的部门的所有人
     */
    public List<Ztree> queryEmployeeList(EmployeeVo employeeVo) throws Exception;

    /**
     * @param employeeVo 根据人员信息查询当前人员同组织机构的人员信息
     * @return
     */
    public List<Employee> queryOrgEmployeeList(EmployeeVo employeeVo) throws Exception;

    /**
     * 查询作业区下所有角色名称为XXX的人员
     * Author:cp
     */
    List<Employee> queryEmployeeByAreaOrgIdAndRoleName(String areaOrgId,String roleName);


    /**
     * 修改人员信息
     *
     * @param record
     * @return
     */
    int update(Employee record);
}
